package com.ck567.netty.config

import io.netty.channel.ChannelHandlerContext

import java.time.LocalDateTime

import io.netty.handler.codec.http.websocketx.TextWebSocketFrame

import io.netty.util.concurrent.GlobalEventExecutor

import io.netty.channel.group.DefaultChannelGroup

import io.netty.channel.group.ChannelGroup

import io.netty.channel.SimpleChannelInboundHandler
import java.lang.Exception


/**
 * 聊天的 handler
 * TextWebSocketFrame  用于为websockt处理文本的对象
 */
class ChatHandler : SimpleChannelInboundHandler<TextWebSocketFrame?>() {

    //客户端创建的时候触发，当客户端连接上服务端之后，就可以获取该channel，然后放到channelGroup中进行统一管理
    @Throws(Exception::class)
    override fun handlerAdded(ctx: ChannelHandlerContext) {
        clients.add(ctx.channel())
    }

    //客户端销毁的时候触发，
    @Throws(Exception::class)
    override fun handlerRemoved(ctx: ChannelHandlerContext) {
        //当handlerRemoved 被触发时候，channelGroup会自动移除对应的channel
        //clients.remove(ctx.channel());
        println("客户端断开，当前被移除的channel的短ID是：" + ctx.channel().id().asShortText())
    }

    companion object {
        //用于记录和管理所有客户端的channel
        private val clients: ChannelGroup = DefaultChannelGroup(GlobalEventExecutor.INSTANCE)
    }

    override fun channelRead0(ctx: ChannelHandlerContext?, msg: TextWebSocketFrame?) {
        //客户端传递过来的消息
        val content = msg?.text()
        println("接收到了客户端的消息是:$content")

        //将客户端发送过来的消息刷到所有的channel中
        for (channel in clients) {
            channel.write(content)
            //channel.writeAndFlush(msg);
            channel.writeAndFlush(
                TextWebSocketFrame("[服务器接收到了客户端的消息:]" + LocalDateTime.now() + ",消息为:" + content))
        }
    }

}